package ejb.com.bbva.cbm.util.voucher;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringEscapeUtils;

import cbm.commons.UtilitarioFunciones;
import ejb.cbm.admin.entity.ParametroEntity;
import ejb.com.bbva.cbm.dominio.MontoDenominacion;
import ejb.com.bbva.cbm.util.CacheDatos;
import ejb.com.bbva.cbm.util.Constante;

public class DatosVoucherOperacionCaja extends DatosVoucher
{
	private long tipoCajaId;
	
	private double montoTotal;
	private double montoDescuadre;
	private double montoDeteriorado;
	private double patronCalidad;
	
	private String terminalTraspaso;
	private boolean confirmacionTraspaso;
	
	private String usuarioAutorizacion;
	private String motivoAutorizacion;
	private String descripcionAutorizacion;
	
	private String usuarioExtorno;
	private String motivoExtorno;
	private String descripcionExtorno;
	private String remesaTranspaso;
	private String observacion;
	
	private List<MontoDenominacion> montosDenominacion;
	private List<ParametroEntity> tiposDenominacion;

	public DatosVoucherOperacionCaja() {
		//super(56,0);
		super(42,0);
	}
	
	public long getTipoCajaId() {
		return tipoCajaId;
	}
	public void setTipoCajaId(long tipoCajaId) {
		this.tipoCajaId = tipoCajaId;
	}
	public double getMontoTotal() {
		return montoTotal;
	}
	public String getMontoTotalFormato() {
		return UtilitarioFunciones.formatearMontoNumerico(montoTotal);
	}
	public void setMontoTotal(double montoTotal) {
		this.montoTotal = montoTotal;
	}
	public double getMontoDescuadre() {
		return montoDescuadre;
	}
	public void setMontoDescuadre(double montoDescuadre) {
		this.montoDescuadre = montoDescuadre;
	}
	public List<MontoDenominacion> getMontosDenominacion() {
		return montosDenominacion;
	}
	public void setMontosDenominacion(List<MontoDenominacion> montosDenominacion) {
		this.montosDenominacion = montosDenominacion;
	}
	public List<ParametroEntity> getTiposDenominacion() {
		return tiposDenominacion;
	}
	public void setTiposDenominacion(List<ParametroEntity> tiposDenominacion) {
		this.tiposDenominacion = tiposDenominacion;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	private String getTituloVoucher() {
		if(tipoTransaccionId == Constante.TRANSACCION_APERTURA_ID) {
			if (tipoCajaId == Constante.PARA_TIPO_CAJA_ID) {
				return "--- SALDO INICIAL DE CAJA ---";
			} else {
				return "--- SALDO INICIAL DE BOVEDA ---";
			}
		} else if(tipoTransaccionId == Constante.TRANSACCION_CIERRE_ID) {
			if (tipoCajaId == Constante.PARA_TIPO_CAJA_ID) {
				return "--- SALDO FINAL DE CAJA ---";
			} else {
				return "--- SALDO FINAL DE BOVEDA ---";
			}
		} else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_ID) {
			if(confirmacionTraspaso == false) {
				if (tipoCajaId == Constante.PARA_TIPO_CAJA_ID) {
					return "--- TRASPASO DE SALIDA DE CAJA ---";
				} else {
					//return "--- TRASPASO DE SALIDA DE BOVEDA ---";
					return "--- INGRESO DE EFECTIVO ---";
				}
			} else {
				if (tipoCajaId == Constante.PARA_TIPO_CAJA_ID) {
					return "--- CONFIRMAR REMESA DE CAJA ---";
				} else {
					return "--- CONFIRMAR REMESA DE BOVEDA ---";
				}
			}
		} else {
			return "";
		}
	}
	
	private String getTituloAjusteVoucher() {
		if(tipoTransaccionId == Constante.TRANSACCION_CIERRE_ID) {
			if (tipoCajaId == Constante.PARA_TIPO_CAJA_ID) {
				return "--- AJUSTE POR DIFERENCIA DE CAJA ---";
			} else {
				return "--- AJUSTE POR DIFERENCIA DE BOVEDA ---";
			}
		} else {
			return "";
		}
	}
	
	@Override
	public String generarCadenaImpresion() {
		escribir(UtilitarioFunciones.formatStringCENTER(getTituloVoucher(), 43, ' '));
		escribir(UtilitarioFunciones.SALTO_DE_LINEA);
		escribir(UtilitarioFunciones.SALTO_DE_LINEA);
		escribir("%-9s%s%s%13s%s%n%n", "FECHA" , ": ", UtilitarioFunciones.formatearFecha(fechaOperacion, "dd-MM-yyyy"), "HORA : ", UtilitarioFunciones.formatearFecha(fechaOperacion,"HH:mm"));
		escribir("%-9s%s%s%n", "TERMINAL", ": ", terminalId);
		escribir("%-9s%s%s%n", "USUARIO" , ": ", usuarioId);
		escribir("%-9s%s%s%n", "OFICINA" , ": ", oficinaId);
		escribir("%-9s%s%s%n%n", "DIVISA", ": ", CacheDatos.getInstance().getDescripcionParametroPorId(Constante.TIPO_DIVISA_CU, divisaId));
		if (!(tipoCajaId == Constante.PARA_TIPO_CAJA_ID)) {
			escribir("%-9s%s%s%n", "PROCEDENCIA" , ": ", remesaTranspaso);
			escribir("%-9s%s%s%n", "REFERENCIA" , ": ", observacion );
		}
		if(this.divisaId.equals("EUR")){
			this.divisaSimbolo = "EUR";
		}
		boolean impresion = true;
		for (ParametroEntity tipoDenominacion : tiposDenominacion) {
			boolean existeDenominacion = false;
			for (MontoDenominacion monto : montosDenominacion) {
				if(tipoDenominacion.getCodigoparametro().longValue() == monto.getTipoId()) { existeDenominacion = true; break; }
			}
			if (existeDenominacion) {
				escribir("%-9s%s%n", tipoDenominacion.getDescripcion().toUpperCase(), ": ");
				for (MontoDenominacion monto : montosDenominacion) {
					if(tipoDenominacion.getCodigoparametro().longValue() == monto.getTipoId()) {
						escribir("%17s%8s%15s%n", UtilitarioFunciones.formatearMontoNumerico(monto.getValorNumerico()), (impresion)?divisaSimbolo:"", UtilitarioFunciones.formatearMontoNumerico(monto.getValorIngresado()));
						impresion = false;
					}
				}
				escribir("\n");
			}
		}
		if(montoDeteriorado > 0) {
			escribir("%-15s%s%23s%n","DETERIORADOS"  , ": ", UtilitarioFunciones.formatearMontoNumerico(montoDeteriorado));
			escribir("\n");
		}
		if (patronCalidad > 0) {
			escribir("%-15s%s%23s%n","PATRON CALIDAD", ": ", UtilitarioFunciones.formatearMontoNumerico(patronCalidad));
			escribir("\n");
		}

		escribir("%17s%23s%n%n", "TOTAL "+divisaSimbolo, UtilitarioFunciones.formatearMontoNumerico(montoTotal));
		String glosa = generarGlosaOperacionCaja(this.tipoCajaId);
		if(glosa != null && !glosa.trim().equals("")) {
			escribir("%-6s%s%s%n","GLOSA" , ": ", glosa);
		}
		escribir("%-6s%s%s%n","CLAVE" , ": ", generarClaveOperacion());
		escribir(UtilitarioFunciones.formatStringCENTER(oficinaNombre, 43, ' '));
		escribir("\n\n\n\n\n ");
		
		if(montoDescuadre != 0) {
			escribir(UtilitarioFunciones.formatStringCENTER(getTituloAjusteVoucher(), 43, ' '));
			escribir(UtilitarioFunciones.SALTO_DE_LINEA);
			escribir(UtilitarioFunciones.SALTO_DE_LINEA);
			escribir("%-9s%s%s%13s%s%n%n", "FECHA"   , ": ", UtilitarioFunciones.formatearFecha(fechaOperacion, "dd-MM-yyyy"), "HORA : ", UtilitarioFunciones.formatearFecha(fechaOperacion,"HH:mm"));
			escribir("%-16s%s%s%n", "AFECTACION"     , ": ", (montoDescuadre>0)?"SOBRANTE":"FALTANTE");
			escribir("%-16s%s%s%n", "MONEDA"         , ": ", CacheDatos.getInstance().getDescripcionParametroPorId(Constante.TIPO_DIVISA_CU, divisaId));
			escribir("%-16s%s%s%n", "IMPORTE"        , ": ", UtilitarioFunciones.formatearMontoNumerico(Math.abs(montoDescuadre)));
			escribir("%-16s%s%s%n", "USUARIO ORIGEN" , ": ", usuarioAutorizacion);
			escribir("%-16s%s%s%n", "VINCULO LABORAL", ": ", "PLANILLA");
			escribir("\n\n\n\n");
			escribir(UtilitarioFunciones.formatStringCENTER("_______________________________", 43, ' '));
			escribir("\n");
			escribir(UtilitarioFunciones.formatStringCENTER("SELLO Y FIRMA DEL AUTORIZADOR", 43, ' '));
			escribir("\n\n");
			String glosaDife = getCodigoParametroGlosaCajaAjuste(Constante.TRANSACCION_AJUSTE_DIFE_ID);
			if(glosa != null && !glosa.trim().equals("")) {
				escribir("%-6s%s%n","GLOSA" , ": ",glosaDife);
			}
			escribir("%-6s%s%s%n","CLAVE" , ": ", generarClaveOperacion());
			escribir(UtilitarioFunciones.formatStringCENTER(oficinaNombre, 43, ' '));
			escribir("\n\n\n\n\n\n ");
		}
		escribir(".");
		escribir("\n\n\n ");
		return generarCadena();
	}
	public static void main(String[] args) {
		DatosVoucherOperacionCaja voucher = new DatosVoucherOperacionCaja();
		voucher.setTipoTransaccionId(Constante.TRANSACCION_APERTURA_ID);
		voucher.setTipoCajaId(Constante.PARA_TIPO_CAJA_ID);
		voucher.setDivisaId("PEN");
		voucher.setDivisaSimbolo("S/.");
		voucher.setOficinaId("0001");
		voucher.setOficinaNombre("SAN ISIDRO");
		voucher.setTerminalId("1234");
		voucher.setOperacionId("12345");
		voucher.setTransaccionId("APER");
		voucher.setUsuarioId("P000001");
		voucher.setFechaOperacion(new Date());
		
		List<ParametroEntity> tiposDenominacion = new ArrayList<ParametroEntity>();
		ParametroEntity para1 = new ParametroEntity();
		para1.setCodigoparametro((long)1);
		para1.setDescripcion("Billetes");
		ParametroEntity para2 = new ParametroEntity();
		para2.setCodigoparametro((long)1);
		para2.setDescripcion("Monedas");

		tiposDenominacion.add(para1);
		tiposDenominacion.add(para2);
		
		List<MontoDenominacion> montos = new ArrayList<MontoDenominacion>();
		
		for (int i = 1; i < 3; i++) {
			for (int j = 1; j <= 5; j++) {
				MontoDenominacion monto = new MontoDenominacion();
				monto.setTipoId(i);
				monto.setValorIngresado(1000000);
				monto.setValorNumerico((i*j*100.5));
				montos.add(monto);
			}
		}
		
		voucher.setMontoTotal(122222323.23);
		voucher.setMontosDenominacion(montos);
		voucher.setTiposDenominacion(tiposDenominacion);
		
		//System.out.println("=====================================================");
		//System.out.println(voucher.generarCadenaImpresion());
		//System.out.println("=====================================================");
		
		//System.out.println(String.format("e = %+10.4f", Math.E));
		//System.out.println(String.format("%10s%n", "1234")+"A");
		//System.out.println(String.format("Formatting %s is easy %d %f", "with Java", 10, 98.6));
		//System.out.println(String.format("%08d", 98));
	}

	public void setMontoDeteriorado(double montoDeteriorado) {
		this.montoDeteriorado = montoDeteriorado;
	}

	public double getMontoDeteriorado() {
		return montoDeteriorado;
	}

	public String getMontoDeterioradoFormato() {
		return UtilitarioFunciones.formatearMontoNumerico(montoDeteriorado);
	}

	public void setPatronCalidad(double patronCalidad) {
		this.patronCalidad = patronCalidad;
	}

	public double getPatronCalidad() {
		return patronCalidad;
	}

	public String getPatronCalidadFormato() {
		return UtilitarioFunciones.formatearMontoNumerico(patronCalidad);
	}

	public String getUsuarioAutorizacion() {
		return usuarioAutorizacion;
	}

	public void setUsuarioAutorizacion(String usuarioAutorizacion) {
		this.usuarioAutorizacion = usuarioAutorizacion;
	}

	public String getMotivoAutorizacion() {
		return motivoAutorizacion;
	}

	public void setMotivoAutorizacion(String motivoAutorizacion) {
		this.motivoAutorizacion = motivoAutorizacion;
	}

	public String getDescripcionAutorizacion() {
		return descripcionAutorizacion;
	}

	public void setDescripcionAutorizacion(String descripcionAutorizacion) {
		this.descripcionAutorizacion = descripcionAutorizacion;
	}

	public String getUsuarioExtorno() {
		return usuarioExtorno;
	}

	public void setUsuarioExtorno(String usuarioExtorno) {
		this.usuarioExtorno = usuarioExtorno;
	}

	public String getMotivoExtorno() {
		return motivoExtorno;
	}

	public void setMotivoExtorno(String motivoExtorno) {
		this.motivoExtorno = motivoExtorno;
	}

	public String getDescripcionExtorno() {
		return descripcionExtorno;
	}

	public void setDescripcionExtorno(String descripcionExtorno) {
		this.descripcionExtorno = descripcionExtorno;
	}

	public void setTerminalTraspaso(String terminalTraspaso) {
		this.terminalTraspaso = terminalTraspaso;
	}

	public String getTerminalTraspaso() {
		return terminalTraspaso;
	}

	public void setConfirmacionTraspaso(boolean confirmacionTraspaso) {
		this.confirmacionTraspaso = confirmacionTraspaso;
	}

	public boolean getConfirmacionTraspaso() {
		return confirmacionTraspaso;
	}

	public String getRemesaTranspaso() {
		return remesaTranspaso;
	}

	public void setRemesaTranspaso(String remesaTranspaso) {
		this.remesaTranspaso = remesaTranspaso;
	}
	
	
	
}
